/*
This file is part of the ZeroFusion MapleStory Server
Copyright (C) 2008 Patrick Huy <patrick.huy@frz.cc> 
Matthias Butz <matze@odinms.de>
Jan Christian Meyer <vimes@odinms.de>
ZeroFusion organized by "RMZero213" <RMZero213@hotmail.com>

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License version 3
as published by the Free Software Foundation. You may not use, modify
or distribute this program under any other version of the
GNU Affero General Public License.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU Affero General Public License for more details.

You should have received a copy of the GNU Affero General Public License
along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
package server.events;

import java.util.concurrent.ScheduledFuture;
import client.MapleCharacter;
import server.Timer.EventTimer;
import tools.packet.CField;
import tools.packet.CWvsContext;

public class MapleFitness extends MapleEvent {

    private static final long serialVersionUID = 845748950824L;
    private long time = 600000; //change
    private long timeStarted = 0;
    private ScheduledFuture<?> fitnessSchedule, msgSchedule;

    public MapleFitness(final int channel, final MapleEventType type) {
	super(channel,type);
    }

    @Override
    public void finished(final MapleCharacter chr) {
        givePrize(chr);
        chr.finishAchievement(20);
    }

    @Override
    public void onMapLoad(MapleCharacter chr) {
	super.onMapLoad(chr);
        if (isTimerStarted()) {
            chr.getClient().getSession().write(CField.getClock((int) (getTimeLeft() / 1000)));
        }
    }

    @Override
    public void startEvent() {
        unreset();
        super.reset(); //isRunning = true
        broadcast(CField.getClock((int) (time / 1000)));
        this.timeStarted = System.currentTimeMillis();
        checkAndMessage();

        fitnessSchedule = EventTimer.getInstance().schedule(new Runnable() {

            @Override
            public void run() {
                for (int i = 0; i < type.mapids.length; i++) {
                    for (MapleCharacter chr : getMap(i).getCharactersThreadsafe()) {
                        warpBack(chr);
                    }
                }
                unreset();
            }
        }, this.time);


        broadcast(CWvsContext.serverNotice(0, "O portal foi aberto agora. Pressione para cima no portal e entre."));
    }

    public boolean isTimerStarted() {
        return timeStarted > 0;
    }

    public long getTime() {
        return time;
    }

    public void resetSchedule() {
        this.timeStarted = 0;
        if (fitnessSchedule != null) {
            fitnessSchedule.cancel(false);
        }
        fitnessSchedule = null;
        if (msgSchedule != null) {
            msgSchedule.cancel(false);
        }
        msgSchedule = null;
    }

    @Override
    public void reset() {
        super.reset();
        resetSchedule();
        getMap(0).getPortal("join00").setPortalState(false);
    }

    @Override
    public void unreset() {
        super.unreset();
        resetSchedule();
        getMap(0).getPortal("join00").setPortalState(true);
    }

    public long getTimeLeft() {
        return time - (System.currentTimeMillis() - timeStarted);
    }

    public void checkAndMessage() {
        msgSchedule = EventTimer.getInstance().register(new Runnable() {

            @Override
            public void run() {
                final long timeLeft = getTimeLeft();
                if (timeLeft > 9000 && timeLeft < 11000) {
                    broadcast(CWvsContext.serverNotice(0, "Voce tem 10 segundos restante. Aqueles de voces que nao conseguiram ganhar o evento, desejamos boa sorte na proxima! Bom trabalho a todos! Vejo voce por ai~"));
                } else if (timeLeft > 11000 && timeLeft < 101000) {
                    broadcast(CWvsContext.serverNotice(0, "Certo, voce nao tem muito tempo restante. Apresse-se um pouco!"));
                } else if (timeLeft > 101000 && timeLeft < 201000) {
                    broadcast(CWvsContext.serverNotice(0, "O quarto estagio e o ultimo do [The Maple Physical Fitness Test]. Por favor nao desista no ultimo minuto e de seu melhor. A premiacao esta lhe esperando la no topo!"));
                } else if (timeLeft > 201000 && timeLeft < 301000) {
                    broadcast(CWvsContext.serverNotice(0, "O terceiro estagio pode ter algumas armadilhas que voce pode cair. Seja cuidadoso para pegar uma boa colocacao."));
                } else if (timeLeft > 301000 && timeLeft < 361000) {
                    broadcast(CWvsContext.serverNotice(0, "Para aqueles que possuem muito lag, por favor mova-se mais devagar para evitar futuras falhas e caidas pelo lag."));
                } else if (timeLeft > 361000 && timeLeft < 501000) {
                    broadcast(CWvsContext.serverNotice(0, "Por favor lembre que se voce morrer no evento, voce sera eliminado do jogo. Se voce estiver ruim de HP primeiro use uma pocao ou recupere seu hp antes de se mover."));
                } else if (timeLeft > 501000 && timeLeft < 601000) {
                    broadcast(CWvsContext.serverNotice(0, "A coisa mais importante que voce precisara sera saber como se esquivar das bananas jogadas pelos Lupinos, sabendo disso seu desempenho sera muito melhor durante o trajeto!"));
                } else if (timeLeft > 601000 && timeLeft < 661000) {
                    broadcast(CWvsContext.serverNotice(0, "O segundo estagio oferece bananas jogadas pelos lupinos. Certifique se voce esta desviando delas para subir sem cair."));
                } else if (timeLeft > 661000 && timeLeft < 701000) {
                    broadcast(CWvsContext.serverNotice(0, "Please remember that if you die during the event, you'll be eliminated from the game. You still have plenty of time left, so either take a potion or recover HP first before moving on."));
                } else if (timeLeft > 701000 && timeLeft < 781000) {
                    broadcast(CWvsContext.serverNotice(0, "Todos que conseguirem passar no evento [The Maple Physical Fitness Test] no tempo receberao um item, indiferente da ordem de chegada, entao relaxe, nao tenha pressa e complete os 4 estagios."));
                } else if (timeLeft > 781000 && timeLeft < 841000) {
                    broadcast(CWvsContext.serverNotice(0, "Pode ter um lag pesado de acordo com a quantidade de jogadores no estagio 1. Isso nao sera dificil, entao certifique-se de nao cair por causa do lag."));
                } else if (timeLeft > 841000) {
                    broadcast(CWvsContext.serverNotice(0, "[MapleStory Physical Fitness Test] consiste em 4 estagios, e se acontecer de voce morrer durante o jogo, voce sera eliminado, entao seja cuidadoso com isso."));
                }
            }
        }, 60000);
    }
}
